home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 3 / CD ACTUAL 3.iso / linux / system / bsvc-1.000 / bsvc-1 / bsvc-1.0.4 / src / Framework / Event.cxx < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-26  |  4.2 KB  |  168 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // $Id: Event.cxx,v 1.1 1994/02/18 19:49:38 bmott Exp $
  3. ///////////////////////////////////////////////////////////////////////////////
  4. //
  5. // Event.cxx
  6. //
  7. //   This class maintains a queue of events requested by EventBase derived
  8. // objects.
  9. //
  10. //
  11. // BSVC "A Microprocessor Simulation Framework"
  12. // Copyright (c) 1993
  13. // By: Bradford W. Mott
  14. // August 11,1993
  15. //
  16. ///////////////////////////////////////////////////////////////////////////////
  17. // $Log: Event.cxx,v $
  18. // Revision 1.1  1994/02/18  19:49:38  bmott
  19. // Initial revision
  20. //
  21. ///////////////////////////////////////////////////////////////////////////////
  22.  
  23. #include "Event.hxx"
  24. #include "Time.hxx"
  25.  
  26. ///////////////////////////////////////////////////////////////////////////////
  27. // EventBase Destructor
  28. ///////////////////////////////////////////////////////////////////////////////
  29. EventBase::~EventBase()
  30.   // Remove any events in the EventHandler for this object
  31.   event_handler->Remove(this);
  32. }
  33.  
  34. ///////////////////////////////////////////////////////////////////////////////
  35. // EventHandler Constructor
  36. ///////////////////////////////////////////////////////////////////////////////
  37. EventHandler::EventHandler()
  38.     : list((void *)0),
  39.       iterations(0),
  40.       usec_per_check(20)
  41. {
  42.   Time time;
  43.  
  44.   old_time=time.seconds();
  45. }
  46.  
  47.  
  48. ///////////////////////////////////////////////////////////////////////////////
  49. // Check for any expired events
  50. ///////////////////////////////////////////////////////////////////////////////
  51. void EventHandler::Check()
  52. {
  53.   long new_time;
  54.   Time time;                         
  55.  
  56.   ++iterations;                      // This is another iteration
  57.   new_time=time.seconds();           // Get the current time in seconds
  58.  
  59.   // Check to see if it's time to update usec_per_check
  60.   if(new_time!=old_time)
  61.   {
  62.     usec_per_check=((new_time-old_time)*1000000)/iterations;
  63.     old_time=new_time;
  64.     iterations=0;
  65.   }
  66.  
  67.   // If the list isn't empty    
  68.   if(list != (void *)0)
  69.   {
  70.     // Decrement delta_time of the earliest event
  71.     if((list->delta_time -= usec_per_check) <= 0)
  72.     {
  73.       Event *tmp=list;
  74.  
  75.       list=list->next;
  76.       if(list != (void *)0)
  77.         list->delta_time += tmp->delta_time;  // In case of some overrun
  78.  
  79.       // This has to be done last because the callback might Add new events :-)
  80.       tmp->Dispatch();
  81.       delete tmp;
  82.     }
  83.   }
  84. }
  85.  
  86. ///////////////////////////////////////////////////////////////////////////////
  87. // Add an event to the event list
  88. ///////////////////////////////////////////////////////////////////////////////
  89. void EventHandler::Add(EventBase *object, long data, void* pointer, long time)
  90. {
  91.   Event *event=new Event(object,data,pointer,time);
  92.  
  93.   if(list == (void *)0)
  94.   {
  95.     list=event;
  96.     event->delta_time=time;
  97.   }
  98.   else if(time < list->delta_time)
  99.   {
  100.     event->next = list;
  101.     event->delta_time = time;
  102.     list->delta_time -= time;
  103.     list = event;
  104.   }
  105.   else
  106.   {
  107.     Event *p=list;
  108.     long tmp_delta = list->delta_time;
  109.  
  110.     while(p->next != (void *)0)
  111.     {
  112.       if(time < (tmp_delta + p->next->delta_time) )
  113.       {
  114.         event->delta_time = time-tmp_delta;
  115.         p->next->delta_time -= event->delta_time;
  116.         event->next = p->next;
  117.         p->next = event;
  118.         break;
  119.       }
  120.       else
  121.       {
  122.         p=p->next;
  123.         tmp_delta += p->delta_time;
  124.       }
  125.     }
  126.  
  127.     if(p->next == (void *)0)
  128.     {
  129.       p->next = event;
  130.       event->delta_time = time-tmp_delta;
  131.     }
  132.   } 
  133.  
  134. ///////////////////////////////////////////////////////////////////////////////
  135. // Remove events for the given object
  136. ///////////////////////////////////////////////////////////////////////////////
  137. void EventHandler::Remove(EventBase* object)
  138. {
  139.   Event *p,*q;
  140.   int done=0;
  141.  
  142.   // Keep looping until no events are deleted
  143.   while(!done)
  144.   {
  145.     done=1;
  146.  
  147.     // Loop through all of the events removing the first one for this object
  148.     for(q=(Event*)0,p=list;p!=(Event*)0;q=p,p=p->next)
  149.     {
  150.       // Check to see if it belongs to object
  151.       if(p->Owner() == object)
  152.       {
  153.         // Delete the event from the event list
  154.         if(q == (Event*)0) 
  155.           list=list->next;
  156.         else
  157.           q->next=p->next;
  158.         delete p;
  159.         done=0;
  160.         break;
  161.       }
  162.     }
  163.   }
  164. }
  165.  
  166.